package models;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class Dictionary implements DictionaryProc {
private static Dictionary dictionary = new Dictionary();
private HashMap<String, ArrayList<String>> dictionaryMap;
private String message;
private FileWriter writer;
private Dictionary() {
dictionaryMap = new HashMap<String, ArrayList<String>>();
}
@Override
public void addWord(String word) {
assert word != null;
assert dictionaryMap.containsKey(word) == false;
assert wellFormed();
int sizeWord = dictionaryMap.size();
dictionaryMap.put(word, new ArrayList<String>());
// message += "\nAdded word " + word;
assert dictionaryMap.containsKey(word);
assert dictionaryMap.size() == sizeWord + 1;
assert wellFormed();
}
@Override
public void removeWord(String word) {
assert word!=null;
assert (dictionaryMap.containsKey(word));
assert wellFormed();
int sizeWord = dictionaryMap.size();
dictionaryMap.remove(word);
message += "\nRemoved word " + word;
for (String tempWord : dictionaryMap.keySet()) {
Iterator<String> tempSyn = dictionaryMap.get(tempWord).iterator();
while (tempSyn.hasNext()) {
String synonym = tempSyn.next();
if (synonym.compareTo(word) == 0) {
tempSyn.remove();
// message += "\nRemoved synonym " + word + " from word " +
// tempWord;
}
}
}
assert (dictionaryMap.containsKey(word) == false);
assert dictionaryMap.size() == sizeWord - 1;
assert wellFormed();
}
@Override
public void addSynonym(String word, String synonym) {
assert word != null;
assert synonym != null;
assert wellFormed();
assert dictionaryMap.containsKey(word);
dictionaryMap.get(word).add(synonym);
if (dictionaryMap.containsKey(synonym) == false)
dictionaryMap.put(synonym, new ArrayList<String>());
dictionaryMap.get(synonym).add(word);
for (String syn : dictionaryMap.get(word)) {
if (syn.equals(synonym) == false) {
dictionaryMap.get(syn).add(synonym);
dictionaryMap.get(synonym).add(syn);
}
}
// message+="\n Synonym "+synonym +" was added to word "+word +"and
// viceversa";
assert dictionaryMap.containsKey(synonym);
assert dictionaryMap.get(word).contains(synonym);
assert dictionaryMap.get(synonym).contains(word);
assert wellFormed();
}
@Override
public void removeSynonym(String word, String synonym) {
assert word != null;
assert synonym != null;
assert dictionaryMap.containsKey(word);
assert wellFormed();
dictionaryMap.get(word).remove(synonym);
dictionaryMap.get(synonym).remove(word);
for (String syn : dictionaryMap.get(word)) {
dictionaryMap.get(syn).remove(synonym);
dictionaryMap.get(synonym).remove(syn);
}
// message+="\n Synonym "+synonym +" was removed from word "+word +"and
// viceversa";
assert dictionaryMap.get(word).contains(synonym) == false;
assert dictionaryMap.get(synonym).contains(word) == false;
assert wellFormed();
}
@Override
public String displayWord(String word) {
assert word!=null;
assert dictionaryMap.containsKey(word);
assert wellFormed();
String entri = "\n";
entri += word + " = ";
for (String syn : dictionaryMap.get(word)) {
entri += syn + " , ";
}
assert dictionaryMap.containsKey(word);
assert wellFormed();
assert entri!=null;
return entri;
}
@Override
public HashSet<String> searchWord(String key) {
assert key != null;
assert wellFormed();
boolean found = false;
HashSet<String> matchingWords = new HashSet<String>();
for (String word : dictionaryMap.keySet()) {
String pref;
String suff;
boolean st = false;
boolean en = false;
if (key.contains("*")) {
int index = key.indexOf("*");
if (index != 0) {
pref = key.substring(0, index);
st = word.startsWith(pref);
}
if (index != key.length()) {
suff = key.substring(index + 1, key.length());
en = word.endsWith(suff);
}
if (index == 0) {
if (en == true) {
matchingWords.add(word);
found = true;
}
} else if (index == word.length() - 1) {
if (st == true) {
matchingWords.add(word);
found = true;
}
} else if ((st) && (en)) {
matchingWords.add(word);
found = true;
}
} else if (key.contains("?")) {
if (word.length() == key.length()) {
int index = key.indexOf("?");
pref = key.substring(0, index);
suff = key.substring(index + 1, key.length());
if (pref.equals(word.substring(0, index))) {
if (suff.equals(word.substring(index + 1, word.length()))) {
matchingWords.add(word);
found = true;
}
}
}
} else {
if (word.equals(key)){
matchingWords.add(key);
found = true;
}
}
}
if (found==false) matchingWords.add("No word matches your search.");
assert wellFormed();
assert matchingWords!=null;
return matchingWords;
}
public static Dictionary getInstance() {
return dictionary;
}
public static void setInstance(Dictionary dictionary) {
Dictionary.dictionary = dictionary;
}
public HashMap<String, ArrayList<String>> getDictionaryMap() {
return dictionaryMap;
}
public void setDictionaryMap(HashMap<String, ArrayList<String>> dictionaryMap) {
this.dictionaryMap = dictionaryMap;
}
public void showMessage() {
System.out.println(message);
}
public boolean wellFormed() {
boolean isWellFormed = true;
for (String word : dictionaryMap.keySet())
for (String syn : dictionaryMap.get(word)) {
if (dictionaryMap.containsKey(syn) == false)
isWellFormed = false;
}
return isWellFormed;
}
public void writeToJson() {
ObjectMapper mapper = new ObjectMapper();
try {
String jsonFromDictionary = mapper.writeValueAsString(dictionaryMap);
writer = new FileWriter("dictionary.txt");
writer.write(jsonFromDictionary);
writer.close();
} catch (JsonProcessingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void readFromJson() {
ObjectMapper mapper = new ObjectMapper();
BufferedReader buffer = null;
try {
buffer = new BufferedReader(new FileReader("dictionary.txt"));
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
dictionaryMap = (HashMap<String, ArrayList<String>>) mapper.readValue(buffer, HashMap.class);
} catch (JsonParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JsonMappingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
buffer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}}